package net.lulihu.pangolin.headless.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class FileKit {

    /**
     * 读取文件流转成字符串输出
     * <br>
     * 如果文件不存在，则返回null
     *
     * @param filepath 文件路径
     * @return 字符串
     */
    public static List<String> readFileAccordingToLine(String filepath) throws IOException {
        File file = new File(filepath);
        if (!file.exists()) return null;

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            List<String> result = new ArrayList<>();
            String s;
            while ((s = br.readLine()) != null) {
                result.add(s);
            }
            return result;
        }
    }

    /**
     * 写文件
     *
     * @param filePath 文件地址
     * @param lines    文件行
     * @throws IOException 写入文件错误
     */
    public static void writeFile(String filePath, List<String> lines) throws IOException {
        createFile(filePath);
        Files.write(Paths.get(filePath), lines);
    }


    /**
     * 写文件
     *
     * @param filePath 文件地址
     * @param content  文件内容
     * @throws IOException 写入文件错误
     */
    public static void writeFile(String filePath, String content) throws IOException {
        createFile(filePath);
        Files.write(Paths.get(filePath), content.getBytes());
    }


    /**
     * 创建文件，可以包括创建多级文件目录 。
     * <p>
     * 根据抽象字串文件名新建文件，若文件的上级目录不存在，则先创建目录，再创建文件，返回新文件. 若文件存在,直接返回.
     * </p>
     *
     * @param filename 待创建的文件的抽象文件名称,若为null返回null;若此名称的文件已存在,则直接返回该文件.
     * @return File 创建的文件
     * @throws IOException
     */
    public static File createFile(final String filename) throws IOException {
        return createFile(new File(filename));
    }

    /**
     * 创建文件，可以包括创建多级文件目录
     * <p>
     * 由文件对象创建文件，若文件的上级目录不存在，则先创建目录，再创建文件，返回新文件. 若文件存在,直接返回.
     * </p>
     *
     * @param file 待创建的文件
     * @return File 创建的文件
     */
    public static File createFile(final File file) throws IOException {
        if (!file.exists()) {
            createDirectoryRecursively(file.getParent());
            file.createNewFile();
        }
        return file;
    }

    /**
     * 创建文件目录(包括子目录) 支持创建多级文件目录，如“d:/aaa/bbb/ccc”
     *
     * @param directory 待创建的文件(夹),支持多级路径. 若为文件或null返回false; 若目录已存在则返回true;
     * @return boolean 创建成功为true 反之false
     */
    public static boolean createDirectoryRecursively(String directory) {
        if (directory == null) {
            return false;
        }
        File pathname = new File(directory);
        if (pathname.exists()) {
            return !pathname.isFile();
        } else if (!pathname.isAbsolute()) {
            pathname = new File(pathname.getAbsolutePath());
        }
        final String parent = pathname.getParent();
        if (!createDirectoryRecursively(parent)) {
            return false;
        }
        return pathname.mkdir();
    }


    /**
     * 删除文件/文件夹
     *
     * @param file {@linkplain File}
     * @return true 成功反之失败
     */
    public static boolean delete(File file) {
        if (!file.exists()) {
            return false;
        }

        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null && files.length != 0)
                for (File f : files) {
                    delete(f);
                }
        }
        return file.delete();
    }

}
